package org.lanqiao.tjut.control;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.lanqiao.tjut.bean.DbCityBean;
import org.lanqiao.tjut.bean.DbProvinceBean;
import org.lanqiao.tjut.myUtils.MyUtils;
import org.lanqiao.tjut.service.ICommonService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class CommonsControl {

	// 组合service层，依赖注入
	@Resource
	private ICommonService commonServiceImpl;

	/**
	 * 使用c层转发web-info下的页面显示请求处理
	 * 
	 * @return
	 */
	@RequestMapping("/redirect.do")
	public String doRedirect(String page) {
		MyUtils.logger.debug("进行了页面跳转：" + page);
		return page;
	}

	/*
	 * 将当前的C请的处理不经过视图层处理，并且可以直接将返回的结果转换为 json对象，
	 * 然后由response对象发回客户端，其后由客户端的xmlHttpRquest对象进行处理
	 */
	@ResponseBody
	@RequestMapping("/getProvinceInfo.do")
	public List<DbProvinceBean> getProvinceInfo(String opt) {
		// 调用service业务逻辑处理层进行省份信息获取操作
		List<DbProvinceBean> lst = commonServiceImpl.selectAllProvinceInfo();
		MyUtils.logger.debug("执行了方法：getProvinceInfo,参数opt：" + opt);
		return lst;
	}

	@ResponseBody
	@RequestMapping("/getCityInfo.do")
	public List<DbCityBean> getCityInfo(String pid) {
		// 调用service业务逻辑处理层进行省份信息获取操作
		List<DbCityBean> lst = commonServiceImpl.selectCitiesByProvinceCode(pid);
		MyUtils.logger.debug("执行了方法：getProvinceInfo,参数opt：" + pid);
		return lst;
	}

	@ResponseBody
	@RequestMapping("/getCityInfo2.do")
	public List<DbCityBean> getCityInfo2(String province) {
		// 调用service业务逻辑处理层进行省份信息获取操作
		List<DbCityBean> lst = commonServiceImpl.selectCitiesByProvinceCode(province);
		MyUtils.logger.debug("执行了方法：getProvinceInfo,参数province：" + province);
		return lst;
	}
	/*
	 * public ModelAndView doRedirect2(String page) {
	 * 
	 * return new ModelAndView(page); }
	 */

	@RequestMapping("doFileUpload1.do")
	public ModelAndView doFileUplodOne(HttpServletRequest request, MultipartFile file, String username) {
		ModelAndView mav = new ModelAndView();

		// 进行性能计算
		long lStartTime = System.currentTimeMillis();
		// 打印上传的原始文件名
		MyUtils.logger.info("fileName--" + file.getOriginalFilename());
		MyUtils.logger.info("userName--" + username);

		// 使用字节流进行文件保存
		// 获取文件保存的服务器根路径
		String strBasePath = request.getSession().getServletContext().getRealPath("/");
		MyUtils.logger.debug("项目的根路径：" + strBasePath);
		// 创建上文件的服务器相对路径和文件名
		String strFileNewName = "uploadFiles/files1" + "/" + new Date().getTime() + file.getOriginalFilename();
		MyUtils.logger.debug("数据库保存的上传文件相对于服务器根路径的相对路径：" + strFileNewName);
		// 上传到服务器的文件全路径名
		String upFileName = strBasePath + strFileNewName;
		// 使用oi字节流进行文件上传
		try {
			// 输出流
			OutputStream os = new FileOutputStream(upFileName);
			// 上传文件的输入流
			InputStream is = file.getInputStream();
			// 使用输出流将文件输入流写出到上传目录
			byte[] temp = new byte[1024];
			int len = -1;
			while ((len = is.read(temp)) != -1) {
				os.write(temp, 0, len);
			}
			os.flush();
			os.close();
			is.close();
		} catch (Exception e) {
			// 文件上传异常
			MyUtils.logger.debug("文件上传出现异常：" + e.getMessage());
		}

		// 统计性能
		long lEndTime = System.currentTimeMillis();
		MyUtils.logger.debug("运行时间：" + (lEndTime - lStartTime) + "ms");

		// 将上传文件相对于服务器的路径信息保存到数据库中
		// 数据库中保存的是 strFileNewName 变量的值（是上传的服务器的文件相对于项目根路径 文件名）
		// 跳转显示页面之前将文件显示的 相对于服务器的路径（保存到数据的那个路径；或者是从数据库中读取的文件路径）
		mav.addObject("uploadFileURL", strFileNewName);
		mav.addObject("username", username);
		// 上传成功的显示页面
		mav.setViewName("fileUploadManager/fileUploadSuccess");
		return mav;
	}

	@RequestMapping("doFileUpload2.do")
	public ModelAndView doFileUplodTwo(HttpServletRequest request, MultipartFile file, String username) {
		ModelAndView mav = new ModelAndView();

		// 进行性能计算
		long lStartTime = System.currentTimeMillis();
		// 打印上传的原始文件名
		MyUtils.logger.info("fileName--" + file.getOriginalFilename());
		MyUtils.logger.info("userName--" + username);

		// 使用字节流进行文件保存
		// 获取文件保存的服务器根路径
		String strBasePath = request.getSession().getServletContext().getRealPath("/");
		MyUtils.logger.debug("项目的根路径：" + strBasePath);
		// 创建上文件的服务器相对路径和文件名
		String strFileNewName = "uploadFiles/files2" + "/" + new Date().getTime() + file.getOriginalFilename();
		MyUtils.logger.debug("数据库保存的上传文件相对于服务器根路径的相对路径：" + strFileNewName);
		// 上传到服务器的文件全路径名
		String upFileName = strBasePath + strFileNewName;

		// 使用springmvc提供的方法进行文件上传
		// 创建新上传的文件对象
		File upFile = new File(upFileName);

		try {
			file.transferTo(upFile);
		} catch (Exception e) {
			// 文件上传异常
			MyUtils.logger.debug("文件上传出现异常：" + e.getMessage());
		}

		// 统计性能
		long lEndTime = System.currentTimeMillis();
		MyUtils.logger.debug("运行时间：" + (lEndTime - lStartTime) + "ms");

		// 将上传文件相对于服务器的路径信息保存到数据库中
		// 数据库中保存的是 strFileNewName 变量的值（是上传的服务器的文件相对于项目根路径 文件名）
		// 跳转显示页面之前将文件显示的 相对于服务器的路径（保存到数据的那个路径；或者是从数据库中读取的文件路径）
		mav.addObject("uploadFileURL", strFileNewName);
		mav.addObject("username", username);
		// 上传成功的显示页面
		mav.setViewName("fileUploadManager/fileUploadSuccess");
		return mav;
	}

	@RequestMapping("doFileUpload3.do")
	public ModelAndView doFileUplodTwo(HttpServletRequest request, String username) {
		ModelAndView mav = new ModelAndView();

		// 进行性能计算
		long lStartTime = System.currentTimeMillis();
		MyUtils.logger.info("userName--" + username);

		// 使用字节流进行文件保存

		// 使用springmvc提供的方法进行文件上传
		// 将当前上下文初始化给 CommonsMutipartResolver(MutipartResolver接口实现类)
		CommonsMultipartResolver cmr = new CommonsMultipartResolver(request.getServletContext());
		// 判定当前的request请求是否需要进行文件数据流处理
		if (cmr.isMultipart(request)) {
			// 进行文件处理
			// 有文件数据流上传
			// 将request进行转换为MultipartRequest，然后进行处理
			MultipartRequest mr = (MultipartRequest) request;
			// 获取request中的所有的文件名
			Iterator it = mr.getFileNames();
			// 获取文件保存的服务器根路径
			String strBasePath = request.getSession().getServletContext().getRealPath("/");
			MyUtils.logger.debug("项目的根路径：" + strBasePath);
			// 遍历处理这些文件
			while (it.hasNext()) {
				// 从MultipartRequest获取MultipartFile对象进行处理
				MultipartFile file = mr.getFile(it.next().toString());
				// 创建上文件的服务器相对路径和文件名
				String strFileNewName = "uploadFiles/files3" + "/" + new Date().getTime() + file.getOriginalFilename();
				MyUtils.logger.debug("数据库保存的上传文件相对于服务器根路径的相对路径：" + strFileNewName);
				// 上传到服务器的文件全路径名
				String upFileName = strBasePath + strFileNewName;
				// 创建新上传的文件对象
				File upFile = new File(upFileName);

				// 上传文件到服务器
				try {
					file.transferTo(upFile);
				} catch (Exception e) {
					// 文件上传异常
					MyUtils.logger.debug("文件上传出现异常：" + e.getMessage());
				}

				// 将上传文件相对于服务器的路径信息保存到数据库中
				// 数据库中保存的是 strFileNewName 变量的值（是上传的服务器的文件相对于项目根路径 文件名）
				MyUtils.logger.info("fileName--" + file.getOriginalFilename());
				// 下面2行仅作测试使用，写在这里没有任何意义（此处应该进行文件路径的数据库保存处理）
				// 跳转显示页面之前将文件显示的 相对于服务器的路径（保存到数据的那个路径；或者是从数据库中读取的文件路径）
				mav.addObject("uploadFileURL", strFileNewName);
			}
		}

		// 统计性能
		long lEndTime = System.currentTimeMillis();
		MyUtils.logger.debug("运行时间：" + (lEndTime - lStartTime) + "ms");

		mav.addObject("username", username);
		// 上传成功的显示页面
		mav.setViewName("fileUploadManager/fileUploadSuccess");
		return mav;
	}

}
